package com.mail.server.service;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mail.dubbo.api.*;
import com.mail.model.db.*;
import com.mail.model.vo.MyPage;
import com.mail.model.vo.UmsMenuVo;
import com.mail.server.common.R;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author 吕永乐
 * @date 2022/06/21 19:09
 **/
@Service
public class UmsRoleService {

	@DubboReference
	private UmsRoleApi umsRoleApi;

	@DubboReference
	private UmsRoleMenuRelationApi umsRoleMenuRelationApi;

	@DubboReference
	private UmsMenuApi umsMenuApi;

	@DubboReference
	private UmsRoleResourceRelationApi umsRoleResourceRelationApi;

	@DubboReference
	private UmsResourceApi umsResourceApi;

	/**
	 * 获取所有角色
	 * @return
	 */
	public List<UmsRole> listAll() {
		List<UmsRole> umsRoles= umsRoleApi.getAll();
		return umsRoles;
	}

	/**
	 * 根据角色名称分页获取角色列表(分页查询)
	 * @param pageNum
	 * @param pageSize
	 * @param keyword
	 * @return
	 */
	public MyPage<UmsRole> listByPage(Long pageNum, Long pageSize, String keyword) {
		Page<UmsRole> page = umsRoleApi.getListByPage(pageNum, pageSize, keyword);
		return MyPage.init(page);
	}

	/**
	 * 获取角色相关菜单
	 * @param roleId
	 * @return
	 */
	public List<UmsMenu> listMenu(Long roleId) {
		List<UmsRoleMenuRelation> umsRoleMenuRelations = umsRoleMenuRelationApi.getByRoleId(roleId);
		if(CollUtil.isEmpty(umsRoleMenuRelations)){
			return new ArrayList<>();
		}
		// 提取 menuId
		List<Long> menuIds = CollUtil.getFieldValues(umsRoleMenuRelations, "menuId", Long.class);
		List<UmsMenu> menus = umsMenuApi.getByIds(menuIds);
		return menus;
	}


	/**
	 * 给角色分配菜单
	 * @param menuIds 分配的菜单列表
	 * @param roleId 当前操作的角色id
	 * @return
	 */
	public R<Integer> allocMenu(Long roleId, List<Long> menuIds) {
		// 1. 首先根据 roleId 删除 对应的数据
		umsRoleMenuRelationApi.removeByRoleId(roleId);
		// 2. 不为空,执行添加操作
		if(CollUtil.isNotEmpty(menuIds)){
			// 2.1 添加传来的menuIds
			// 遍历添加
			for (Long menuId : menuIds) {
				UmsRoleMenuRelation umsRoleMenuRelation = new UmsRoleMenuRelation();
				umsRoleMenuRelation.setMenuId(menuId);
				umsRoleMenuRelation.setRoleId(roleId);
				umsRoleMenuRelationApi.save(umsRoleMenuRelation);
			}
		}
		return R.success(menuIds.size(), "操作成功!");
	}


	/**
	 * 给角色分配资源
	 * @param roleId
	 * @param resourceIds
	 * @return
	 */
	public R<Integer> allocResource(Long roleId, List<Long> resourceIds) {
		// 1. 首先根据 roleId 删除 对应的数据
		umsRoleResourceRelationApi.removeByRoleId(roleId);
		// 2. 不为空,执行添加操作
		if(CollUtil.isNotEmpty(resourceIds)){
			// 2.1 添加传来的resourceIds
			// 遍历添加
			for (Long resourceId : resourceIds) {
				UmsRoleResourceRelation umsRoleMenuRelation = new UmsRoleResourceRelation();
				umsRoleMenuRelation.setResourceId(resourceId);
				umsRoleMenuRelation.setRoleId(roleId);
				umsRoleResourceRelationApi.save(umsRoleMenuRelation);
			}
		}
		return R.success(resourceIds.size(), "操作成功!");
	}

	/**
	 * 获取角色相关资源
	 * @param roleId
	 * @return
	 */
	public List<UmsResource> listResource(Long roleId) {
		// 根据 roleId 查询对应的 resourceId
		List<UmsRoleResourceRelation> umsRoleResourceRelations = umsRoleResourceRelationApi.getByRoleId(roleId);
		if(CollUtil.isEmpty(umsRoleResourceRelations)){
			return new ArrayList<>();
		}
		List<Long> resourceIds = CollUtil.getFieldValues(umsRoleResourceRelations, "resourceId", Long.class);
		// 根据 id 集合批量查询
		List<UmsResource> umsResources = umsResourceApi.getByIds(resourceIds);
		return umsResources;
	}

	/**
	 * 添加角色
	 * @param umsRole
	 * @return
	 */
	public R<Integer> create(UmsRole umsRole) {
		// 角色名称为空,返回错误信息,提示
		if(StringUtils.isEmpty(umsRole.getName())){
			return R.success(null, "角色名称不能为空!", 404);
		}
		umsRole.setCreateTime(DateUtil.toLocalDateTime(new Date()));
		Integer count = umsRoleApi.create(umsRole);
		return R.success(count, "操作成功!");
	}

	/**
	 * 批量删除角色
	 * @param ids
	 * @return
	 */
	public R<Integer> delete(List<Long> ids) {
		Integer count = umsRoleApi.deleteByIds(ids);
		return R.success(count, "操作成功!");
	}

	/**
	 * 修改角色
	 * @param umsRole
	 * @return
	 */
	public R<Integer> update(UmsRole umsRole) {
		// 角色名称为空,返回错误信息,提示
		if(StringUtils.isEmpty(umsRole.getName())){
			return R.success(null, "角色名称不能为空!", 404);
		}
		Integer count = umsRoleApi.update(umsRole);
		return R.success(count, "操作成功!");
	}

	/**
	 * 修改角色状态
	 * @param id
	 * @param status
	 * @return
	 */
	public R<Integer> updateStatus(Long id, Long status) {
		umsRoleApi.updateStatus(id, status);
		return R.success(1, "操作成功!");
	}
}
